package jdk5;

import java.beans.BeanInfo;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import org.junit.jupiter.api.Test;
import beans.User;

/**
 * 　　PropertyDescriptor类:
 * <p>
 * 　　PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法：
 * <p>
 * 　　1. getPropertyType()，获得属性的Class对象;
 * 　　2. getReadMethod()，获得用于读取属性值的方法；getWriteMethod()，获得用于写入属性值的方法;
 * 　　3. hashCode()，获取对象的哈希值;
 * 　　4. setReadMethod(Method readMethod)，设置用于读取属性值的方法;
 * 　　5. setWriteMethod(Method writeMethod)，设置用于写入属性值的方法。
 */
public class Introspector {
	
	@Test
	public void m1() throws Exception {
		User user = new User();
		// 获取属性
		PropertyDescriptor propDesc = new PropertyDescriptor("userName", user.getClass());

		// 获取写方法
		Method writeMethod = propDesc.getWriteMethod();
		// 通过写方法写入属性值
		writeMethod.invoke(user, "wong");
		System.out.println(user);

		// 获取读方法
		Method readMethod = propDesc.getReadMethod();
		// 通过读取方法读取属性值
		Object name = readMethod.invoke(user);
		System.out.println(name);
	}

	@Test
	public void m2() throws Exception {
		// 如果不想把父类的属性也列出来的话，那getBeanInfo的第二个参数填写父类的信息
		BeanInfo userInfo = java.beans.Introspector.getBeanInfo(User.class, Object.class);

		// PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性
		PropertyDescriptor[] propertyDescriptors = userInfo.getPropertyDescriptors();
		System.out.println(propertyDescriptors);

		// MethodDescriptor 描述了一种特殊方法，即 Java Bean 支持从其他组件对其进行外部访问
		MethodDescriptor[] methodDescriptors = userInfo.getMethodDescriptors();
		System.out.println(methodDescriptors);
	}
}
